home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_jnos / j109lxa4.tgz / j109lxa4.tar / rdate.c < prev    next >
C/C++ Source or Header  |  1994-06-04  |  3KB  |  150 lines

  1. /* Internet rdate client
  2.  * Author: Brian Teravskis, WD0EFL
  3.  * Date: 03/30/92
  4.  *
  5.  * Based on RFC868 Time Protocol
  6.  *
  7.  * Added local hour offset - Doug Crompton 10/28/92
  8.  * and subcommand menu for possible future commands
  9.  */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "global.h"
  13. #include "mbuf.h"
  14. #include "socket.h"
  15. #include "session.h"
  16. #include "proc.h"
  17. #include "netuser.h"
  18. #include "commands.h"
  19. #include "tty.h"
  20. #include "timer.h"
  21. #include <time.h>
  22. #include "cmdparse.h"
  23.  
  24. #define IPPORT_TIME 37
  25. #ifdef __GNUC__
  26. #define DIFFTIME 2208988800LU
  27. #else
  28. #define DIFFTIME 2208988800
  29. #endif
  30. #define RDATETIMEOUT 30
  31.  
  32. static void rdate_timeout __ARGS((void *));
  33. static int rdate_offset=0;
  34.  
  35. static int dordateserver __ARGS((int argc,char *argv[],void *p));
  36. static int dordateoff __ARGS((int argc,char *argv[],void *p));
  37.  
  38. static struct cmds rdatecmds[] = {
  39.     "server", dordateserver, 512, 2,
  40.     "rdate server <address>",
  41.  
  42.     "offset", dordateoff, 0, 0,
  43.     NULLCHAR,
  44.  
  45.     NULLCHAR,
  46. };
  47.  
  48. int
  49. dordate(argc,argv,p)
  50. int argc;
  51. char *argv[];
  52. void *p;
  53. {
  54.     return subcmd(rdatecmds,argc,argv,p);
  55. }
  56.  
  57. static int
  58. dordateserver(argc,argv,p)
  59. int argc;
  60. char *argv[];
  61. void *p;
  62. {
  63.     struct sockaddr_in sock;
  64.     int s,i_state;
  65.     struct mbuf *bp;
  66.     struct timer *t;
  67.     time_t rtime, raw_time;
  68.  
  69.     if((sock.sin_addr.s_addr = resolve(argv[1])) == 0){
  70.         log(-1,"RDATE:Host %s unknown\n",argv[1]);
  71.         return 1;
  72.     }
  73.     sock.sin_family = AF_INET;
  74.     sock.sin_port = IPPORT_TIME;
  75.  
  76.     /* Open connection to time server */
  77.     if((s = socket(AF_INET,SOCK_STREAM,0)) == -1) {
  78.         log(-1,"RDATE:Can't create socket");
  79.         return 1;
  80.     }
  81.     sockmode(s,SOCK_BINARY);
  82.  
  83.     /* Set timeout timer */
  84.     t = (struct timer *)callocw(1, sizeof(struct timer));
  85.     t->func = rdate_timeout;
  86.     t->arg = (void *) &s;
  87.     set_timer(t,RDATETIMEOUT*1000L);
  88.     start_timer(t);
  89.  
  90.     /* Connect to time server */
  91.     if(connect(s,(char *)&sock,sizeof(sock)) == -1){
  92.         /* Connect failed */
  93.         stop_timer(t);
  94.         free(t);
  95.         log(s,"RDATE: Connect failed");
  96.         close_s(s);
  97.         return 1;
  98.     }
  99.     /* Successful connect, stop timout timer */
  100.     stop_timer(t);
  101.     free(t);
  102.     /* Get time info sent by server */
  103.     recv_mbuf(s,&bp,0,NULLCHAR,(int *)0);
  104.     rtime = (time_t)pull32(&bp);
  105.     /* Convert 1900 start date to 1970 start date */
  106.     rtime -= DIFFTIME;
  107.     raw_time=rtime;
  108.     rtime += (rdate_offset*3600L);
  109.     /* Set the system time */
  110.     i_state = dirps();
  111.     stime(&rtime);
  112.     restore(i_state);
  113.     log(s,"RDATE:Clock set to %s from %s\n",ctime(&rtime),argv[1]);
  114.     printf("\nTime received from %s - %s",argv[1],ctime(&raw_time));
  115.     printf("System time set to %s\n",ctime(&rtime));
  116.     free_q(&bp);
  117.     close_s(s);
  118.     return 0;
  119. } /* dordate */
  120.  
  121. /*
  122.  * Close socket after timeout on connect
  123.  */
  124. static void
  125. rdate_timeout(arg)
  126. void *arg;
  127. {
  128.     int     *s;
  129.  
  130.     s = (int *)arg;
  131.     close_s(*s);
  132. } /* rdate_timeout */
  133.  
  134. /* Set time offset */
  135. static int
  136. dordateoff(argc, argv,p)
  137. int argc;
  138. char *argv[];
  139. void *p;
  140. {
  141.     if(argc < 2) {
  142.         tprintf("Usage: 'rdate offset <+-hours>' - Current Offset %d Hours\n",rdate_offset);
  143.         return 0 ;
  144.     }
  145.     
  146.     rdate_offset = atoi(argv[1]);
  147.     return 0;
  148. }
  149.  
  150.